# 前面我们实现了用户的注册这个功能，但是在那个例子中，我们只是把收集的数据单纯的和写死的单个数据进行比对
# 然而在真实业务中，通常会有成百上千的用户，面对这些用户，他们的数据写死在程序中就不可能了
# 因此针对这种情况就有了数据库，数据库是专门存储数据的程序，他提供了基础的查询、增加、删除、修改等功能
# 数据库可以是运行于命令行的、与网络服务程序并行的第三方程序，也可以是当前网络服务程序的一个进程
# 对应的第三方数据库就有MongoDB、MySQL、Redis等等都可以，而Flask也提供了自带的数据库Flask SQLAlchemy
# 针对第三方数据库，他们通常提供了Python的Interface，而Flask的Flask SQLAlchemy就提供了数据库的Python写的接口
# 因此我们就可以在我们的网络服务程序中使用数据库来保存用户数据


# 对数据库而言，有关系型和非关系型数据库。
# 对于关系型数据库，其中的每一个数据，称为一条记录。一系列具有某种关系的数据整体称为一个表
# 对于一个记录，他有不同的字段，每个不同的字段他的值不同，例如一张表有姓名、年龄、学号这三个字段
# 学生A就被这个表中的一个记录所抽象，表中代表A的记录有A的姓名姓名、A的年龄、A的学号这三个值
# Excel就可以当做是一个数据库软件，Excel作为数据库软件，其维护的数据库就是Excel现在正在编辑的Excel表
# 表头一行规定了所有的字段，有name、age、stuid

assert False, "关于数据还没有写完，之前发的哪个教程数据库那一节补全"



from os import name
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)


# 定义一个类来保存配置参数
class Config:
    # mysql 默认端口号是3306，设置链接端口号，注意，需要安装pymysql，否则flask的mysql的驱动默认是MySQLdb，MySQLdb只支持Python2.x
    # 下面指定协议的同时要说明使用pymysql作为MySQL的驱动
    SQLALCHEMY_DATABASE_URI: str = "mysql+pymysql://root:mysql@127.0.0.1:3306/flaskdb"
    SQLALCHEMY_TRACK_MODIFICATIONS: bool = True


# 设置server的配置参数
app.config.from_object(Config)
# 创建SQLAlchemy对象，绑定SQL对象到当前server/app上去
db = SQLAlchemy(app)


# 创建数据库模型类

# 创建角色表（狼人杀）
class Role(db.Model):
    # 指定数据库创建表时候的名字
    __tablename__ = "role"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)


# 创建一个用户表，进行各种设置
class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)            # 默认设置主键自增长，即每增加一个用户，其id这一列自动加一
    name = db.Column(db.String(128), unique=True)       # 要求该表中的name这一列是字符类型，最长128， 且值唯一
    password = db.Column(db.String(128))
    # 设置表之间的关系，新设置一列是用户的角色，这一列的值来自于另外一张表（Role表），即外键
    role_id = db.Column(db.Integer, db.ForeignKey("role.id"))


if __name__ == "__main__":
    # 进行数据库管理的时候是和服务器上的数据库服务器通信，数据库服务器可以在同一台机器上，也可以在不同的机器上，因此上面config中设置了sql database的位置
    # 清除所有的表
    db.drop_all()
    # 创建所有的表
    db.create_all()

    # 创建一张前面的表的模板实例化得到的一个对象，并将其插入到表中
    role1 = Role(name="langren")
    # 使用session将创建对象记录到对象任务中，即声明等下需要插入表
    db.session.add(role1)
    # 提交任务，让数据库服务器向其维护的表中插入该对象
    db.session.commit()

    role2 = Role(name="pingming")
    db.session.add(role2)
    db.session.commit()

    # 插入对象，一个狼人，两个平民
    user1 = User(name="zhangsan", password="123", role_id=role1.id)
    user2 = User(name="lisi", password="231", role_id=role2.id)
    user3 = User(name="wangwu", password="312", role_id=role2.id)

    db.session.add_all(instances=[user1, user2, user3])
    db.session.commit()